﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using SCEM.DTO;

namespace SCEM.DataLayer
{
    /// <summary>
    /// DAO de condições de venda.
    /// </summary>
    public class CondicaoVendaDAO : EntityDAO<CondicaoVenda>, ICondicaoVendaDAO
    {
        public CondicaoVendaDAO()
        {
            CanEntityBeDisabled = false;
            EntityEnabledProperty = "";
            OrderByProperty = "Preco";
        }

        protected override IDTO<CondicaoVenda> ConvertToDTO(CondicaoVenda entity, ObjectContext context)
        {
            CondicaoVendaDTO dto = new CondicaoVendaDTO();
            dto.FornecedorId = entity.Fornecedor.Id.ToString();
            dto.ProdutoId = entity.Produto.Id.ToString();
            dto.Preco = entity.Preco;
            dto.PrazoEntregaHoras = entity.PrazoEntregaHoras;
            dto.QuantidadeMinimaVenda = entity.QuantidadeMinimaVenda;

            return dto;
        }

        public List<CondicaoVendaDTO> GetAll(string idProduto)
        {
            using (SCEMContainer context = new SCEMContainer())
            {
                Guid guidProduto;
                if (!Guid.TryParse(idProduto, out guidProduto))
                    return null;

                IQueryable<Produto> query = context.Produtos.Include("CondicoesVenda").Where(p => p.Id == guidProduto);
                if (query.Count() != 1) // produto não localizado
                    return null;

                Produto produto = query.First();
                List<CondicaoVenda> listaCondicoes = produto.CondicoesVenda.ToList();
                List<CondicaoVendaDTO> listaDTO = new List<CondicaoVendaDTO>();
                foreach (CondicaoVenda item in listaCondicoes)
                    listaDTO.Add((CondicaoVendaDTO)ConvertToDTO(item, context));

                return listaDTO;
            }
        }

        public CondicaoVendaDTO Get(string idProduto, string idFornecedor)
        {
            using (SCEMContainer context = new SCEMContainer())
            {
                CondicaoVenda condicao = GetInternal(idProduto, idFornecedor, context);
                if (condicao != null)
                    return (CondicaoVendaDTO)ConvertToDTO(condicao, context);
                else
                    return null;
            }
        }

        public bool Delete(string idProduto, string idFornecedor)
        {
            using (SCEMContainer context = new SCEMContainer())
            {
                CondicaoVenda condicaoVenda = GetInternal(idProduto, idFornecedor, context);
                if (condicaoVenda == null) // condição de venda não localizada, impossível deletar
                    return false;

                context.DeleteObject(condicaoVenda);
                if (context.SaveChanges() > 0) // deletado com sucesso
                    return true;
                else // erro
                    return false; 
            }
        }

        #region Métodos Privados

        private CondicaoVenda GetInternal(string idProduto, string idFornecedor, SCEMContainer context)
        {
            Guid guidProduto;
            Guid guidFornecedor;

            if (!Guid.TryParse(idProduto, out guidProduto) || !Guid.TryParse(idFornecedor, out guidFornecedor))
                return null;

            IQueryable<CondicaoVenda> query = context.CondicoesVenda.Where(c => c.Produto.Id == guidProduto && c.Fornecedor.Id == guidFornecedor);
            if (query.Count() != 1) // condição de venda não localizada
                return null;

            CondicaoVenda condicaoVenda = query.First();
            return condicaoVenda;
        }

        #endregion

        #region Métodos Não Suportados

        /// <summary>
        /// Método não suportado para esse DAO.
        /// </summary>
        /// <param name="id">Parâmetro ignorado.</param>
        /// <returns>NotSupportedException</returns>
        public override IDTO<CondicaoVenda> Get(string id)
        {
            throw new NotSupportedException();
        }

        /// <summary>
        /// Método não suportado para esse DAO.
        /// </summary>
        /// <param name="pageNumber">Parâmetro ignorado.</param>
        /// <param name="resultsPerPage">Parâmetro ignorado.</param>
        /// <param name="includeDisabledEntities">Parâmetro ignorado.</param>
        /// <returns>NotSupportedException</returns>
        public override List<IDTO<CondicaoVenda>> GetAll(int pageNumber, int resultsPerPage, bool includeDisabledEntities)
        {
            throw new NotSupportedException();
        }

        /// <summary>
        /// Método não suportado para esse DAO.
        /// </summary>
        /// <param name="includeDisabledEntities">Parâmetro ignorado.</param>
        /// <returns>NotSupportedException</returns>
        public override int GetTotalEntities(bool includeDisabledEntities)
        {
            throw new NotSupportedException();
        }

        #endregion

    }
}
